package main

import (
	"encoding/json"
	//"expvar"
	//"net/http"
	"fmt"
	"runtime"
	"time"
)

type Monitor struct {
	Alloc        uint64 `json:"堆内存"`   // 堆内存字节分配数
	TotalAlloc   uint64 `json:"最大堆内存"` // 堆中分配最大字节数
	Sys          uint64 `json:"系统内存"`  // 从系统中获得的总内存
	Mallocs      uint64 `json:"分配对象"`  // 分配对象数
	Frees        uint64 `json:"释放对象"`  // 释放对象数
	LiveObjects  uint64 `json:"存活对象"`  // 存活对象数
	PauseTotalNs uint64 `json:"GC时间"`  // 总GC暂停时间

	NumGC        uint32 `json:"GC次数"`
	NumGoroutine int    `json:"协程数"` // goroutine数量
}

func NewMonitor(duration int) {
	var m Monitor
	var rtm runtime.MemStats
	var interval = time.Duration(duration) * time.Second
	//var goroutines = expvar.NewInt("num_goroutine")

	for {
		<-time.After(interval) // 时间间隔

		// 读取内存状态信息
		runtime.ReadMemStats(&rtm)

		m.NumGoroutine = runtime.NumGoroutine()
		//goroutines.Set(int64(m.NumGoroutine))

		m.Alloc = rtm.Alloc
		m.TotalAlloc = rtm.TotalAlloc
		m.Sys = rtm.Sys
		m.Mallocs = rtm.Mallocs
		m.Frees = rtm.Frees
		m.LiveObjects = m.Mallocs - m.Frees
		m.PauseTotalNs = rtm.PauseTotalNs
		m.NumGC = rtm.NumGC

		b, _ := json.Marshal(m)
		fmt.Println(string(b))
	}
}

func main() {
	go NewMonitor(1) // 性能数据
	select {}        // 业务逻辑
	//http.ListenAndServe(":8080", nil)
}
